
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import * as zrUtil from 'zrender/lib/core/util.js';
import { encodeHTML } from 'zrender/lib/core/dom.js';
import { parseDate, isNumeric, numericToNumber } from './number.js';
import { format as timeFormat, pad } from './time.js';
import { deprecateReplaceLog } from './log.js';
/**
 * Add a comma each three digit.
 */

export function addCommas(x) {
	if (!isNumeric(x)) {
		return zrUtil.isString(x) ? x : '-';
	}

	var parts = (x + '').split('.');
	return parts[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g, '$1,') + (parts.length > 1 ? '.' + parts[1] : '');
}
export function toCamelCase(str, upperCaseFirst) {
	str = (str || '').toLowerCase().replace(/-(.)/g, function (match, group1) {
		return group1.toUpperCase();
	});

	if (upperCaseFirst && str) {
		str = str.charAt(0).toUpperCase() + str.slice(1);
	}

	return str;
}
export var normalizeCssArray = zrUtil.normalizeCssArray;
export { encodeHTML };
/**
 * Make value user readable for tooltip and label.
 * "User readable":
 *     Try to not print programmer-specific text like NaN, Infinity, null, undefined.
 *     Avoid to display an empty string, which users can not recognize there is
 *     a value and it might look like a bug.
 */

export function makeValueReadable(value, valueType, useUTC) {
	var USER_READABLE_DEFUALT_TIME_PATTERN = '{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}';

	function stringToUserReadable(str) {
		return str && zrUtil.trim(str) ? str : '-';
	}

	function isNumberUserReadable(num) {
		return !!(num != null && !isNaN(num) && isFinite(num));
	}

	var isTypeTime = valueType === 'time';
	var isValueDate = value instanceof Date;

	if (isTypeTime || isValueDate) {
		var date = isTypeTime ? parseDate(value) : value;

		if (!isNaN(+date)) {
			return timeFormat(date, USER_READABLE_DEFUALT_TIME_PATTERN, useUTC);
		} else if (isValueDate) {
			return '-';
		} // In other cases, continue to try to display the value in the following code.
	}

	if (valueType === 'ordinal') {
		return zrUtil.isStringSafe(value) ? stringToUserReadable(value) : zrUtil.isNumber(value) ? isNumberUserReadable(value) ? value + '' : '-' : '-';
	} // By default.

	var numericResult = numericToNumber(value);
	return isNumberUserReadable(numericResult) ? addCommas(numericResult) : zrUtil.isStringSafe(value) ? stringToUserReadable(value) : typeof value === 'boolean' ? value + '' : '-';
}
var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];

var wrapVar = function (varName, seriesIdx) {
	return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}';
};
/**
 * Template formatter
 * @param {Array.<Object>|Object} paramsList
 */

export function formatTpl(tpl, paramsList, encode) {
	if (!zrUtil.isArray(paramsList)) {
		paramsList = [paramsList];
	}

	var seriesLen = paramsList.length;

	if (!seriesLen) {
		return '';
	}

	var $vars = paramsList[0].$vars || [];

	for (var i = 0; i < $vars.length; i++) {
		var alias = TPL_VAR_ALIAS[i];
		tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0));
	}

	for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) {
		for (var k = 0; k < $vars.length; k++) {
			var val = paramsList[seriesIdx][$vars[k]];
			tpl = tpl.replace(wrapVar(TPL_VAR_ALIAS[k], seriesIdx), encode ? encodeHTML(val) : val);
		}
	}

	return tpl;
}
/**
 * simple Template formatter
 */

export function formatTplSimple(tpl, param, encode) {
	zrUtil.each(param, function (value, key) {
		tpl = tpl.replace('{' + key + '}', encode ? encodeHTML(value) : value);
	});
	return tpl;
}
export function getTooltipMarker(inOpt, extraCssText) {
	var opt = zrUtil.isString(inOpt) ? {
		color: inOpt,
		extraCssText: extraCssText
	} : inOpt || {};
	var color = opt.color;
	var type = opt.type;
	extraCssText = opt.extraCssText;
	var renderMode = opt.renderMode || 'html';

	if (!color) {
		return '';
	}

	if (renderMode === 'html') {
		return type === 'subItem' ? '<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;' + 'border-radius:4px;width:4px;height:4px;background-color:' // Only support string
    + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>' : '<span style="display:inline-block;margin-right:4px;' + 'border-radius:10px;width:10px;height:10px;background-color:' + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>';
	} else {
		// Should better not to auto generate style name by auto-increment number here.
		// Because this util is usually called in tooltip formatter, which is probably
		// called repeatedly when mouse move and the auto-increment number increases fast.
		// Users can make their own style name by theirselves, make it unique and readable.
		var markerId = opt.markerId || 'markerX';
		return {
			renderMode: renderMode,
			content: '{' + markerId + '|}  ',
			style: type === 'subItem' ? {
				width: 4,
				height: 4,
				borderRadius: 2,
				backgroundColor: color
			} : {
				width: 10,
				height: 10,
				borderRadius: 5,
				backgroundColor: color
			}
		};
	}
}
/**
 * @deprecated Use `time/format` instead.
 * ISO Date format
 * @param {string} tpl
 * @param {number} value
 * @param {boolean} [isUTC=false] Default in local time.
 *           see `module:echarts/scale/Time`
 *           and `module:echarts/util/number#parseDate`.
 * @inner
 */

export function formatTime(tpl, value, isUTC) {
	if (process.env.NODE_ENV !== 'production') {
		deprecateReplaceLog('echarts.format.formatTime', 'echarts.time.format');
	}

	if (tpl === 'week' || tpl === 'month' || tpl === 'quarter' || tpl === 'half-year' || tpl === 'year') {
		tpl = 'MM-dd\nyyyy';
	}

	var date = parseDate(value);
	var getUTC = isUTC ? 'getUTC' : 'get';
	var y = date[getUTC + 'FullYear']();
	var M = date[getUTC + 'Month']() + 1;
	var d = date[getUTC + 'Date']();
	var h = date[getUTC + 'Hours']();
	var m = date[getUTC + 'Minutes']();
	var s = date[getUTC + 'Seconds']();
	var S = date[getUTC + 'Milliseconds']();
	tpl = tpl.replace('MM', pad(M, 2)).replace('M', M).replace('yyyy', y).replace('yy', pad(y % 100 + '', 2)).replace('dd', pad(d, 2)).replace('d', d).replace('hh', pad(h, 2)).replace('h', h).replace('mm', pad(m, 2)).replace('m', m).replace('ss', pad(s, 2)).replace('s', s).replace('SSS', pad(S, 3));
	return tpl;
}
/**
 * Capital first
 * @param {string} str
 * @return {string}
 */

export function capitalFirst(str) {
	return str ? str.charAt(0).toUpperCase() + str.substr(1) : str;
}
/**
 * @return Never be null/undefined.
 */

export function convertToColorString(color, defaultColor) {
	defaultColor = defaultColor || 'transparent';
	return zrUtil.isString(color) ? color : zrUtil.isObject(color) ? color.colorStops && (color.colorStops[0] || {}).color || defaultColor : defaultColor;
}
export { truncateText } from 'zrender/lib/graphic/helper/parseText.js';
/**
 * open new tab
 * @param link url
 * @param target blank or self
 */

export function windowOpen(link, target) {
	/* global window */
	if (target === '_blank' || target === 'blank') {
		var blank = window.open();
		blank.opener = null;
		blank.location.href = link;
	} else {
		window.open(link, target);
	}
}
export { getTextRect } from '../legacy/getTextRect.js';